Praktiska rokasgrāmata mantotā koda refaktorēšanai, aptverot identifikāciju, prioritāšu noteikšanu, tehnikas un labākās prakses modernizācijai un uzturamībai.
Zvēra savaldīšana: Mantotā koda refaktorēšanas stratēģijas
Mantots kods. Pats šis termins bieži vien izraisa asociācijas ar plašām, nedokumentētām sistēmām, trauslām atkarībām un milzīgu baiļu sajūtu. Daudzi izstrādātāji visā pasaulē saskaras ar izaicinājumu uzturēt un attīstīt šīs sistēmas, kas bieži vien ir kritiskas uzņēmuma darbībai. Šī visaptverošā rokasgrāmata sniedz praktiskas stratēģijas mantotā koda refaktorēšanai, pārvēršot vilšanās avotu par modernizācijas un uzlabojumu iespēju.
Kas ir mantots kods?
Pirms iedziļināties refaktorēšanas tehnikās, ir svarīgi definēt, ko mēs saprotam ar "mantotu kodu". Lai gan šis termins var vienkārši attiekties uz vecāku kodu, niansētāka definīcija koncentrējas uz tā uzturamību. Maikls Fezers (Michael Feathers) savā fundamentālajā grāmatā "Working Effectively with Legacy Code" definē mantoto kodu kā kodu bez testiem. Šis testu trūkums apgrūtina drošu koda modificēšanu, neieviešot regresijas. Tomēr mantotam kodam var būt arī citas īpašības:
- Dokumentācijas trūkums: Sākotnējie izstrādātāji var būt aizgājuši, neatstājot gandrīz nekādu dokumentāciju, kas izskaidrotu sistēmas arhitektūru, dizaina lēmumus vai pat pamatfunkcionalitāti.
- Sarežģītas atkarības: Kods var būt cieši saistīts, kas apgrūtina atsevišķu komponenšu izolēšanu un modificēšanu, neietekmējot citas sistēmas daļas.
- Novecojušas tehnoloģijas: Kods var būt rakstīts, izmantojot vecākas programmēšanas valodas, ietvarus vai bibliotēkas, kas vairs netiek aktīvi atbalstītas, radot drošības riskus un ierobežojot piekļuvi moderniem rīkiem.
- Slikta koda kvalitāte: Kods var saturēt dublētu kodu, garas metodes un citas koda "smaržas" (code smells), kas apgrūtina tā saprašanu un uzturēšanu.
- Trausls dizains: Šķietami nelielām izmaiņām var būt neparedzētas un plašas sekas.
Ir svarīgi atzīmēt, ka mantots kods pats par sevi nav slikts. Tas bieži vien atspoguļo nozīmīgu ieguldījumu un iemieso vērtīgas domēna zināšanas. Refaktorēšanas mērķis ir saglabāt šo vērtību, vienlaikus uzlabojot koda uzturamību, uzticamību un veiktspēju.
Kāpēc refaktorēt mantoto kodu?
Mantotā koda refaktorēšana var būt biedējošs uzdevums, taču ieguvumi bieži vien atsver izaicinājumus. Šeit ir daži galvenie iemesli, kāpēc investēt refaktorēšanā:
- Uzlabota uzturamība: Refaktorēšana padara kodu vieglāk saprotamu, modificējamu un atkļūdojamu, samazinot izmaksas un pūles, kas nepieciešamas pastāvīgai uzturēšanai. Globālām komandām tas ir īpaši svarīgi, jo tas samazina paļaušanos uz konkrētiem indivīdiem un veicina zināšanu apmaiņu.
- Samazināts tehniskais parāds: Tehniskais parāds attiecas uz netiešajām pārstrādes izmaksām, ko rada viegla risinājuma izvēle tagad, nevis labākas pieejas izmantošana, kas prasītu ilgāku laiku. Refaktorēšana palīdz nomaksāt šo parādu, uzlabojot koda bāzes kopējo stāvokli.
- Paaugstināta uzticamība: Novēršot koda "smaržas" un uzlabojot koda struktūru, refaktorēšana var samazināt kļūdu risku un uzlabot sistēmas kopējo uzticamību.
- Palielināta veiktspēja: Refaktorēšana var identificēt un novērst veiktspējas vājās vietas, nodrošinot ātrāku izpildes laiku un uzlabotu atsaucību.
- Vienkāršāka integrācija: Refaktorēšana var atvieglot mantotās sistēmas integrāciju ar jaunām sistēmām un tehnoloģijām, veicinot inovāciju un modernizāciju. Piemēram, Eiropas e-komercijas platformai varētu būt nepieciešams integrēties ar jaunu maksājumu vārteju, kas izmanto citu API.
- Uzlabota izstrādātāju morāle: Darbs ar tīru, labi strukturētu kodu ir patīkamāks un produktīvāks izstrādātājiem. Refaktorēšana var uzlabot morāli un piesaistīt talantus.
Refaktorēšanas kandidātu identificēšana
Ne viss mantotais kods ir jārefaktorē. Ir svarīgi noteikt refaktorēšanas darbu prioritātes, pamatojoties uz šādiem faktoriem:
- Izmaiņu biežums: Kods, kas tiek bieži modificēts, ir galvenais kandidāts refaktorēšanai, jo uzturamības uzlabojumiem būs būtiska ietekme uz izstrādes produktivitāti.
- Sarežģītība: Kods, kas ir sarežģīts un grūti saprotams, visticamāk satur kļūdas un to ir grūtāk droši modificēt.
- Kļūdu ietekme: Kodam, kas ir kritisks uzņēmuma darbībai vai kam ir augsts risks izraisīt dārgas kļūdas, jāpiešķir prioritāte refaktorēšanai.
- Veiktspējas vājās vietas: Kods, kas identificēts kā veiktspējas vājā vieta, ir jārefaktorē, lai uzlabotu veiktspēju.
- Koda "smaržas": Pievērsiet uzmanību izplatītām koda "smaržām", piemēram, garām metodēm, lielām klasēm, dublētam kodam un funkciju skaudībai (feature envy). Tie ir rādītāji jomām, kurām refaktorēšana varētu nākt par labu.
Piemērs: Iedomājieties globālu loģistikas uzņēmumu ar mantotu sistēmu sūtījumu pārvaldībai. Modulis, kas atbild par piegādes izmaksu aprēķināšanu, tiek bieži atjaunināts mainīgo noteikumu un degvielas cenu dēļ. Šis modulis ir galvenais kandidāts refaktorēšanai.
Refaktorēšanas tehnikas
Ir pieejamas daudzas refaktorēšanas tehnikas, katra paredzēta konkrētu koda "smaržu" novēršanai vai konkrētu koda aspektu uzlabošanai. Šeit ir dažas biežāk izmantotās tehnikas:
Metodes kompozīcija
Šīs tehnikas koncentrējas uz lielu, sarežģītu metožu sadalīšanu mazākās, vieglāk pārvaldāmās metodēs. Tas uzlabo lasāmību, samazina dublēšanos un padara kodu vieglāk testējamu.
- Metodes izvilkšana (Extract Method): Tā ietver koda bloka identificēšanu, kas veic konkrētu uzdevumu, un tā pārvietošanu uz jaunu metodi.
- Metodes iekļaušana (Inline Method): Tā ietver metodes izsaukuma aizstāšanu ar metodes ķermeni. Izmantojiet to, ja metodes nosaukums ir tikpat skaidrs kā tās ķermenis, vai kad gatavojaties izmantot metodes izvilkšanu, bet esošā metode ir pārāk īsa.
- Pagaidu mainīgā aizstāšana ar vaicājumu (Replace Temp with Query): Tā ietver pagaidu mainīgā aizstāšanu ar metodes izsaukumu, kas aprēķina mainīgā vērtību pēc pieprasījuma.
- Skaidrojošā mainīgā ieviešana (Introduce Explaining Variable): Izmantojiet šo, lai piešķirtu izteiksmes rezultātu mainīgajam ar aprakstošu nosaukumu, tādējādi precizējot tā mērķi.
Funkciju pārvietošana starp objektiem
Šīs tehnikas koncentrējas uz klašu un objektu dizaina uzlabošanu, pārvietojot atbildības tur, kur tām loģiski jābūt.
- Metodes pārvietošana (Move Method): Tā ietver metodes pārvietošanu no vienas klases uz citu klasi, kur tā loģiski pieder.
- Lauka pārvietošana (Move Field): Tā ietver lauka pārvietošanu no vienas klases uz citu klasi, kur tas loģiski pieder.
- Klases izvilkšana (Extract Class): Tā ietver jaunas klases izveidi no saskaņota atbildību kopuma, kas izvilkts no esošas klases.
- Klases iekļaušana (Inline Class): Izmantojiet šo, lai sakļautu klasi citā, kad tā vairs neveic pietiekami daudz funkciju, lai attaisnotu savu pastāvēšanu.
- Delegāta slēpšana (Hide Delegate): Tā ietver metožu izveidi serverī, lai paslēptu deleģēšanas loģiku no klienta, samazinot saistību starp klientu un delegātu.
- Vidutāja noņemšana (Remove Middle Man): Ja klase deleģē gandrīz visu savu darbu, tas palīdz izslēgt vidutāju.
- Ārējās metodes ieviešana (Introduce Foreign Method): Pievieno metodi klienta klasei, lai apkalpotu klientu ar funkcijām, kas patiesībā ir nepieciešamas no servera klases, bet kuras nevar modificēt piekļuves trūkuma vai plānotu izmaiņu dēļ servera klasē.
- Lokālā paplašinājuma ieviešana (Introduce Local Extension): Izveido jaunu klasi, kas satur jaunās metodes. Noderīgi, ja jūs nekontrolējat klases avotu un nevarat pievienot funkcionalitāti tieši.
Datu organizēšana
Šīs tehnikas koncentrējas uz datu uzglabāšanas un piekļuves veida uzlabošanu, padarot tos vieglāk saprotamus un modificējamus.
- Datu vērtības aizstāšana ar objektu (Replace Data Value with Object): Tā ietver vienkāršas datu vērtības aizstāšanu ar objektu, kas iekapsulē saistītos datus un uzvedību.
- Vērtības maiņa uz atsauci (Change Value to Reference): Tā ietver vērtību objekta maiņu uz atsauces objektu, kad vairāki objekti dala vienu un to pašu vērtību.
- Vienvirziena asociācijas maiņa uz divvirzienu (Change Unidirectional Association to Bidirectional): Izveido divvirzienu saiti starp divām klasēm, kur pastāv tikai vienvirziena saite.
- Divvirzienu asociācijas maiņa uz vienvirzienu (Change Bidirectional Association to Unidirectional): Vienkāršo asociācijas, padarot divvirzienu attiecības par vienvirziena.
- Maģiskā skaitļa aizstāšana ar simbolisku konstanti (Replace Magic Number with Symbolic Constant): Tā ietver burtisku vērtību aizstāšanu ar nosauktām konstantēm, padarot kodu vieglāk saprotamu un uzturamu.
- Lauka iekapsulēšana (Encapsulate Field): Nodrošina geteri un seteri lauka piekļuvei.
- Kolekcijas iekapsulēšana (Encapsulate Collection): Nodrošina, ka visas izmaiņas kolekcijā notiek caur rūpīgi kontrolētām metodēm īpašnieka klasē.
- Ieraksta aizstāšana ar datu klasi (Replace Record with Data Class): Izveido jaunu klasi ar laukiem, kas atbilst ieraksta struktūrai, un piekļuves metodēm.
- Tipa koda aizstāšana ar klasi (Replace Type Code with Class): Izveido jaunu klasi, kad tipa kodam ir ierobežots, zināms iespējamo vērtību kopums.
- Tipa koda aizstāšana ar apakšklasēm (Replace Type Code with Subclasses): Gadījumiem, kad tipa koda vērtība ietekmē klases uzvedību.
- Tipa koda aizstāšana ar stāvokli/stratēģiju (Replace Type Code with State/Strategy): Gadījumiem, kad tipa koda vērtība ietekmē klases uzvedību, bet apakšklašu izveide nav piemērota.
- Apakšklases aizstāšana ar laukiem (Replace Subclass with Fields): Noņem apakšklasi un pievieno laukus virsklasei, kas pārstāv apakšklases atšķirīgās īpašības.
Nosacījuma izteiksmju vienkāršošana
Nosacījumu loģika var ātri kļūt sarežģīta. Šo tehniku mērķis ir to precizēt un vienkāršot.
- Nosacījuma sadalīšana (Decompose Conditional): Tā ietver sarežģīta nosacījuma priekšraksta sadalīšanu mazākos, vieglāk pārvaldāmos gabalos.
- Nosacījuma izteiksmes konsolidēšana (Consolidate Conditional Expression): Tā ietver vairāku nosacījuma priekšrakstu apvienošanu vienā, kodolīgākā priekšrakstā.
- Dublētu nosacījuma fragmentu konsolidēšana (Consolidate Duplicate Conditional Fragments): Tā ietver koda, kas dublējas vairākos nosacījuma priekšraksta zaros, pārvietošanu ārpus nosacījuma.
- Vadības karoga noņemšana (Remove Control Flag): Likvidējiet Būla mainīgos, kas tiek izmantoti loģikas plūsmas kontrolei.
- Ligzdota nosacījuma aizstāšana ar aizsargklauzulām (Replace Nested Conditional with Guard Clauses): Padara kodu lasāmāku, novietojot visus īpašos gadījumus augšpusē un apturot apstrādi, ja kāds no tiem ir patiess.
- Nosacījuma aizstāšana ar polimorfismu (Replace Conditional with Polymorphism): Tā ietver nosacījumu loģikas aizstāšanu ar polimorfismu, ļaujot dažādiem objektiem apstrādāt dažādus gadījumus.
- Nulles objekta ieviešana (Introduce Null Object): Tā vietā, lai pārbaudītu nulles vērtību, izveidojiet noklusējuma objektu, kas nodrošina noklusējuma uzvedību.
- Apgalvojuma ieviešana (Introduce Assertion): Skaidri dokumentējiet gaidas, izveidojot testu, kas tās pārbauda.
Metodes izsaukumu vienkāršošana
- Metodes pārdēvēšana (Rename Method): Tas šķiet acīmredzami, bet ir neticami noderīgi, lai padarītu kodu skaidru.
- Parametra pievienošana (Add Parameter): Informācijas pievienošana metodes parakstam ļauj metodei būt elastīgākai un atkārtoti lietojamai.
- Parametra noņemšana (Remove Parameter): Ja parametrs netiek izmantots, atbrīvojieties no tā, lai vienkāršotu saskarni.
- Vaicājuma atdalīšana no modifikatora (Separate Query from Modifier): Ja metode gan maina, gan atgriež vērtību, sadaliet to divās atsevišķās metodēs.
- Metodes parametrizēšana (Parameterize Method): Izmantojiet šo, lai konsolidētu līdzīgas metodes vienā metodē ar parametru, kas maina uzvedību.
- Parametra aizstāšana ar skaidrām metodēm (Replace Parameter with Explicit Methods): Dariet pretējo parametrizēšanai - sadaliet vienu metodi vairākās metodēs, no kurām katra pārstāv noteiktu parametra vērtību.
- Visa objekta saglabāšana (Preserve Whole Object): Tā vietā, lai metodei nodotu dažus konkrētus datu elementus, nododiet visu objektu, lai metodei būtu piekļuve visiem tā datiem.
- Parametra aizstāšana ar metodi (Replace Parameter with Method): Ja metode vienmēr tiek izsaukta ar to pašu vērtību, kas atvasināta no lauka, apsveriet iespēju atvasināt parametra vērtību metodes iekšienē.
- Parametru objekta ieviešana (Introduce Parameter Object): Grupējiet vairākus parametrus objektā, ja tie dabiski pieder kopā.
- Iestatīšanas metodes noņemšana (Remove Setting Method): Izvairieties no setera metodēm, ja lauks ir jāinicializē tikai vienreiz, bet pēc konstruēšanas to nedrīkst modificēt.
- Metodes slēpšana (Hide Method): Samaziniet metodes redzamību, ja tā tiek izmantota tikai vienas klases ietvaros.
- Konstruktora aizstāšana ar rūpnīcas metodi (Replace Constructor with Factory Method): Aprakstošāka alternatīva konstruktoriem.
- Izņēmuma aizstāšana ar testu (Replace Exception with Test): Ja izņēmumi tiek izmantoti kā plūsmas kontrole, aizstājiet tos ar nosacījumu loģiku, lai uzlabotu veiktspēju.
Darbs ar vispārināšanu
- Lauka pacelšana (Pull Up Field): Pārvietojiet lauku no apakšklases uz tās virsklasi.
- Metodes pacelšana (Pull Up Method): Pārvietojiet metodi no apakšklases uz tās virsklasi.
- Konstruktora ķermeņa pacelšana (Pull Up Constructor Body): Pārvietojiet konstruktora ķermeni no apakšklases uz tās virsklasi.
- Metodes nolaišana (Push Down Method): Pārvietojiet metodi no virsklases uz tās apakšklasēm.
- Lauka nolaišana (Push Down Field): Pārvietojiet lauku no virsklases uz tās apakšklasēm.
- Saskarnes izvilkšana (Extract Interface): Izveido saskarni no klases publiskajām metodēm.
- Virsklases izvilkšana (Extract Superclass): Pārvietojiet kopīgo funkcionalitāti no divām klasēm uz jaunu virsklasi.
- Hierarhijas sakļaušana (Collapse Hierarchy): Apvienojiet virsklasi un apakšklasi vienā klasē.
- Šablona metodes veidošana (Form Template Method): Izveidojiet šablona metodi virsklasē, kas definē algoritma soļus, ļaujot apakšklasēm pārrakstīt konkrētus soļus.
- Mantošanas aizstāšana ar deleģēšanu (Replace Inheritance with Delegation): Izveidojiet lauku klasē, kas atsaucas uz funkcionalitāti, nevis to manto.
- Deleģēšanas aizstāšana ar mantošanu (Replace Delegation with Inheritance): Kad deleģēšana ir pārāk sarežģīta, pārejiet uz mantošanu.
Šie ir tikai daži piemēri no daudzajām pieejamajām refaktorēšanas tehnikām. Izvēle, kuru tehniku izmantot, ir atkarīga no konkrētās koda "smaržas" un vēlamā rezultāta.
Piemērs: Gara metode Java lietojumprogrammā, ko izmanto globāla banka, aprēķina procentu likmes. Piemērojot metodes izvilkšanu (Extract Method), lai izveidotu mazākas, mērķtiecīgākas metodes, tiek uzlabota lasāmība un atvieglota procentu likmju aprēķināšanas loģikas atjaunināšana, neietekmējot citas metodes daļas.
Refaktorēšanas process
Refaktorēšanai jāpieiet sistemātiski, lai samazinātu risku un maksimizētu panākumu iespējas. Šeit ir ieteicamais process:
- Identificējiet refaktorēšanas kandidātus: Izmantojiet iepriekš minētos kritērijus, lai identificētu koda apgabalus, kuriem refaktorēšana sniegtu vislielāko labumu.
- Izveidojiet testus: Pirms veicat jebkādas izmaiņas, uzrakstiet automatizētus testus, lai pārbaudītu koda esošo uzvedību. Tas ir ļoti svarīgi, lai nodrošinātu, ka refaktorēšana neievieš regresijas. Vienību testu (unit tests) rakstīšanai var izmantot tādus rīkus kā JUnit (Java), pytest (Python) vai Jest (JavaScript).
- Refaktorējiet pakāpeniski: Veiciet nelielas, pakāpeniskas izmaiņas un palaidiet testus pēc katras izmaiņas. Tas atvieglo jebkuru ieviesto kļūdu identificēšanu un labošanu.
- Iesniedziet izmaiņas bieži (Commit Frequently): Bieži iesniedziet savas izmaiņas versiju kontrolē. Tas ļauj viegli atgriezties pie iepriekšējās versijas, ja kaut kas noiet greizi.
- Pārskatiet kodu: Lūdziet citam izstrādātājam pārskatīt jūsu kodu. Tas var palīdzēt identificēt potenciālās problēmas un nodrošināt, ka refaktorēšana tiek veikta pareizi.
- Pārraugiet veiktspēju: Pēc refaktorēšanas pārraugiet sistēmas veiktspēju, lai nodrošinātu, ka izmaiņas nav izraisījušas veiktspējas regresijas.
Piemērs: Komanda, kas refaktorē Python moduli globālā e-komercijas platformā, izmanto `pytest`, lai izveidotu vienību testus esošajai funkcionalitātei. Pēc tam viņi piemēro klases izvilkšanas (Extract Class) refaktorēšanu, lai atdalītu atbildības un uzlabotu moduļa struktūru. Pēc katras nelielas izmaiņas viņi palaiž testus, lai nodrošinātu, ka funkcionalitāte paliek nemainīga.
Stratēģijas testu ieviešanai mantotā kodā
Kā trāpīgi norādīja Maikls Fezers, mantots kods ir kods bez testiem. Testu ieviešana esošajās kodu bāzēs var šķist milzīgs uzdevums, taču tas ir būtiski drošai refaktorēšanai. Šeit ir vairākas stratēģijas, kā pieiet šim uzdevumam:
Raksturojuma testi (Characterization Tests jeb Golden Master Tests)
Kad saskaraties ar kodu, kas ir grūti saprotams, raksturojuma testi var palīdzēt fiksēt tā esošo uzvedību, pirms sākat veikt izmaiņas. Ideja ir rakstīt testus, kas apstiprina koda pašreizējo izvadi noteiktam ievades datu kopumam. Šie testi ne vienmēr pārbauda pareizību; tie vienkārši dokumentē, ko kods *pašlaik* dara.
Soļi:
- Identificējiet koda vienību, kuru vēlaties raksturot (piemēram, funkciju vai metodi).
- Izveidojiet ievades vērtību kopu, kas pārstāv virkni bieži sastopamu un robežgadījumu scenāriju.
- Palaidiet kodu ar šīm ievadēm un fiksējiet iegūtos rezultātus.
- Uzrakstiet testus, kas apgalvo, ka kods rada tieši šos rezultātus šīm ievadēm.
Uzmanību: Raksturojuma testi var būt trausli, ja pamatā esošā loģika ir sarežģīta vai atkarīga no datiem. Esiet gatavi tos atjaunināt, ja vēlāk nepieciešams mainīt koda uzvedību.
Asna metode un asna klase (Sprout Method and Sprout Class)
Šīs tehnikas, ko arī aprakstījis Maikls Fezers, mērķis ir ieviest jaunu funkcionalitāti mantotā sistēmā, vienlaikus samazinot risku sabojāt esošo kodu.
Asna metode: Kad nepieciešams pievienot jaunu funkciju, kas prasa modificēt esošu metodi, izveidojiet jaunu metodi, kas satur jauno loģiku. Pēc tam izsauciet šo jauno metodi no esošās metodes. Tas ļauj izolēt jauno kodu un testēt to neatkarīgi.
Asna klase: Līdzīgi kā asna metode, bet attiecas uz klasēm. Izveidojiet jaunu klasi, kas implementē jauno funkcionalitāti, un pēc tam integrējiet to esošajā sistēmā.
Izolētā vide (Sandboxing)
Izolētā vide ietver mantotā koda izolēšanu no pārējās sistēmas, ļaujot to testēt kontrolētā vidē. To var izdarīt, izveidojot atkarību aizstājējus (mocks) vai prototipus (stubs), vai palaižot kodu virtuālajā mašīnā.
Mikado metode
Mikado metode ir vizuāla problēmu risināšanas pieeja sarežģītu refaktorēšanas uzdevumu risināšanai. Tā ietver diagrammas izveidi, kas attēlo atkarības starp dažādām koda daļām, un pēc tam koda refaktorēšanu tādā veidā, kas samazina ietekmi uz citām sistēmas daļām. Pamatprincips ir "izmēģināt" izmaiņas un redzēt, kas salūzt. Ja kaut kas salūzt, atgriezieties pie pēdējā strādājošā stāvokļa un pierakstiet problēmu. Pēc tam risiniet šo problēmu, pirms atkārtoti mēģināt veikt sākotnējās izmaiņas.
Rīki refaktorēšanai
Vairāki rīki var palīdzēt refaktorēšanā, automatizējot atkārtotus uzdevumus un sniedzot norādījumus par labākajām praksēm. Šie rīki bieži ir integrēti integrētajās izstrādes vidēs (IDE):
- IDE (piem., IntelliJ IDEA, Eclipse, Visual Studio): IDE nodrošina iebūvētus refaktorēšanas rīkus, kas var automātiski veikt tādus uzdevumus kā mainīgo pārdēvēšana, metožu izvilkšana un klašu pārvietošana.
- Statiskās analīzes rīki (piem., SonarQube, Checkstyle, PMD): Šie rīki analizē kodu, meklējot koda "smaržas", potenciālas kļūdas un drošības ievainojamības. Tie var palīdzēt identificēt koda apgabalus, kuriem refaktorēšana nāktu par labu.
- Koda pārklājuma rīki (piem., JaCoCo, Cobertura): Šie rīki mēra koda procentuālo daļu, ko aptver testi. Tie var palīdzēt identificēt koda apgabalus, kas nav pietiekami testēti.
- Refaktorēšanas pārlūki (piem., Smalltalk Refactoring Browser): Specializēti rīki, kas palīdz lielākās pārstrukturēšanas darbībās.
Piemērs: Izstrādes komanda, kas strādā pie C# lietojumprogrammas globālam apdrošināšanas uzņēmumam, izmanto Visual Studio iebūvētos refaktorēšanas rīkus, lai automātiski pārdēvētu mainīgos un izvilktu metodes. Viņi arī izmanto SonarQube, lai identificētu koda "smaržas" un potenciālās ievainojamības.
Izaicinājumi un riski
Mantotā koda refaktorēšana nav bez izaicinājumiem un riskiem:
- Regresiju ieviešana: Lielākais risks ir kļūdu ieviešana refaktorēšanas procesā. To var mazināt, rakstot visaptverošus testus un refaktorējot pakāpeniski.
- Domēna zināšanu trūkums: Ja sākotnējie izstrādātāji ir aizgājuši, var būt grūti saprast kodu un tā mērķi. Tas var novest pie nepareiziem refaktorēšanas lēmumiem.
- Ciešā saistība (Tight Coupling): Cieši saistītu kodu ir grūtāk refaktorēt, jo izmaiņām vienā koda daļā var būt neparedzētas sekas citās koda daļās.
- Laika ierobežojumi: Refaktorēšana var aizņemt laiku, un var būt grūti pamatot investīcijas ieinteresētajām pusēm, kuras koncentrējas uz jaunu funkciju piegādi.
- Pretestība izmaiņām: Daži izstrādātāji var pretoties refaktorēšanai, īpaši, ja viņi nav pazīstami ar iesaistītajām tehnikām.
Labākās prakses
Lai mazinātu izaicinājumus un riskus, kas saistīti ar mantotā koda refaktorēšanu, ievērojiet šīs labākās prakses:
- Iegūstiet atbalstu: Nodrošiniet, ka ieinteresētās puses saprot refaktorēšanas priekšrocības un ir gatavas ieguldīt nepieciešamo laiku un resursus.
- Sāciet ar mazumiņu: Sāciet ar mazu, izolētu koda daļu refaktorēšanu. Tas palīdzēs veidot pārliecību un demonstrēt refaktorēšanas vērtību.
- Refaktorējiet pakāpeniski: Veiciet nelielas, pakāpeniskas izmaiņas un bieži testējiet. Tas atvieglos jebkuru ieviesto kļūdu identificēšanu un labošanu.
- Automatizējiet testus: Uzrakstiet visaptverošus automatizētus testus, lai pārbaudītu koda uzvedību pirms un pēc refaktorēšanas.
- Izmantojiet refaktorēšanas rīkus: Izmantojiet savā IDE vai citos rīkos pieejamos refaktorēšanas rīkus, lai automatizētu atkārtotus uzdevumus un sniegtu norādījumus par labākajām praksēm.
- Dokumentējiet savas izmaiņas: Dokumentējiet izmaiņas, ko veicat refaktorēšanas laikā. Tas palīdzēs citiem izstrādātājiem saprast kodu un izvairīties no regresiju ieviešanas nākotnē.
- Nepārtraukta refaktorēšana: Padariet refaktorēšanu par nepārtrauktu izstrādes procesa daļu, nevis vienreizēju notikumu. Tas palīdzēs uzturēt kodu bāzi tīru un uzturamu.
Noslēgums
Mantotā koda refaktorēšana ir izaicinošs, bet atalgojošs darbs. Ievērojot šajā rokasgrāmatā izklāstītās stratēģijas un labākās prakses, jūs varat savaldīt zvēru un pārveidot savas mantotās sistēmas par uzturamiem, uzticamiem un augstas veiktspējas aktīviem. Atcerieties pieiet refaktorēšanai sistemātiski, bieži testēt un efektīvi komunicēt ar savu komandu. Ar rūpīgu plānošanu un izpildi jūs varat atraisīt slēpto potenciālu savā mantotajā kodā un bruģēt ceļu nākotnes inovācijām.